package protocolo;

import java.io.IOException;
import java.net.*;
import java.util.ArrayList;

import protocolo.Pedido.TipoPedido;

import monitor.ManagerObjetos;


public class Atendedor extends Thread {
	
	//	 En que puerto escucharemos
	private int miPuerto = 5000;
	
	public ArrayList<Pedido> pedidosAliados;
	public ArrayList<Pedido> respuestasAliados;
	
	private DatagramSocket miSocket;
	
	
	public Atendedor() {
		
		// Creamos el socket
		try {
			miSocket = new DatagramSocket(miPuerto, InetAddress.getByName("localhost"));
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			System.err.println("Error al crear mi socket");
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			System.err.println("Error al crear mi socket, host no identificado");
		}
		 
		pedidosAliados = new ArrayList<Pedido>();
		respuestasAliados = new ArrayList<Pedido>();
		
	}
	
	
	// Me quedo bloqueado recibiendo paquetes
	public void run() {
				
		while (true) {
			// Creamos un DatagramPacket y hacemos un receive
			byte buf[] = new byte[1024];
			DatagramPacket pack = new DatagramPacket(buf, buf.length);
			try {
				miSocket.receive(pack);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				System.err.println("Error al recibir el paquete");
			}
			
			// Obtenemos los datos del mensaje de acuerdo al protocolo
			Pedido pedido = new Pedido();
			pedido = pedido.obtenerPedido(pack);
			
			// Agregamos el pedido al buffer que corresponda
			if (pedido.esAyuda()) {
				synchronized (pedidosAliados) {
					if (! pedidosAliados.isEmpty()) {
						// lanzar timer
					}
					pedidosAliados.add(pedido);
				}
			} else if (pedido.esAccepted()){
				synchronized (pedidosAliados) {
					if (! pedidosAliados.isEmpty()) {
						pedidosAliados.get(0).setTipo(TipoPedido.ACCEPTED);
					}
				}
			} else {
				synchronized (respuestasAliados) {
					respuestasAliados.add(pedido);
				}
			}
			
			// Imprimimos
			System.out.println("Se Recibieron datos de: " + pedido.getDireccionIP() + ":" + pedido.getPuerto() + " con largo: " +  pack.getLength());
			System.out.write(pack.getData(),0,pack.getLength());
			System.out.println();	 			
		}
	}
	

}
